当前位置:  开发笔记 > 编程语言 > 正文

如何将Rust`Args`转换为argc和argv C等价物?

如何解决《如何将Rust`Args`转换为argc和argvC等价物?》经验,为你挑选了1个好方法。

我正在使用需要的C API(特别是MPI_Init)int argc, char **argv.我正在尝试argc, argv使用以下代码生成等效代码:

let argc = std::env::args().len() as c_int;
let c_strs: ~[CString] = std::env:args().map(|s: & &str| s.to_c_str());
let mut argv: ~[*c_char] = c_strs.map(|c: &CString| c.with_ref(|ptr| ptr));
if null_terminate {
    argv.push(std::ptr::null());
}

通过在Github上调整此讨论.

它失败了:

error: expected type, found `~`
src/lib.rs:37   let c_strs: ~[CString] = std::env::args().map(|s: & &str| s.to_c_str());
                            ^

我摆脱了~它然后它找不到to_c_str(),并不确定要替换什么to_c_str,to_raw()(例如)失败.

有谁知道转换Args为更友好的C格式的方法?



1> Tibor Benke..:

我的答案适用于目前稳定的Rust(1.5),可能还有beta和nightly.

以下Rust代码调用foo(argc, argv)C中实现的函数.签名foo非常类似于main函数.

extern crate libc;

use libc::c_char;
use libc::c_int;

use std::ffi::CString;

#[link(name="foo")]
extern "C" {
    fn foo(argc: c_int, argv: *const *const c_char);
}

fn main() {
    // create a vector of zero terminated strings
    let args = std::env::args().map(|arg| CString::new(arg).unwrap() ).collect::>();
    // convert the strings to raw pointers
    let c_args = args.iter().map(|arg| arg.as_ptr()).collect::>();
    unsafe {
        // pass the pointer of the vector's internal buffer to a C function
        foo(c_args.len() as c_int, c_args.as_ptr());
    };
}

注意,C端只借用指向字符串的指针.如果要存储它们,请使用strdup()它们.

我也用unwrap()CString实例.如果您的字符串包含0个字节,则会返回错误,请参阅https://doc.rust-lang.org/stable/std/ffi/struct.CString.html#method.new.

证明:

我将此代码放入货物项目中,并libc作为依赖项添加.该foo()函数如下所示:

#include 

void foo(int argc, char* argv[]) {
    int i;

    for (i = 0; i < argc; i++) {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
}

我编译了这段代码:

gcc foo.c -o libfoo.so -shared -fPIC

然后复制libfoo.sotarget/debug/deps(只是在库搜索路径中).然后我运行我的货物项目:

$ cargo run the quick brown fox
   Compiling args v0.1.0 (file:///home/tibi/Codes/Rust/argv/args)
     Running `target/debug/args the quick brown fox`
argv[0]: target/debug/args
argv[1]: the
argv[2]: quick
argv[3]: brown
argv[4]: fox

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有